package com.itheima.ood.inner.demo05;

/**
 * 演示匿名内部类
 * 前提：需要存在一个类或者接口
 */
public class JumpDemo01 {

    public static void main(String[] args) {

        /**
         * 匿名内部类的创建格式：
         *
         * new 类名/接口名(){
         *     // 重写抽象方法
         * }
         *
         */
        new Jump(){

            @Override
            public void jump() {
                System.out.println("jump................");
            }

        }.jump();

        /**
         * 匿名内部类的本质是一个对象，代表的是谁的对象？代表的是继承了某一个类或者实现了某一个接口的子类对象
         */

        // 代表的是继承了Animal的一个子类对象
        new Animal(){

            @Override
            public void eat() {
                System.out.println("eat方法执行了.............");
            }

            @Override
            public void show() {
                System.out.println("show.....................");
            }

        };


        System.out.println("------------------------------------------------");

        /**
         * 如果现在存在两个方法，那么我们应该如何去调用呢？
         */
        new Animal(){

            @Override
            public void eat() {
                System.out.println("eat方法执行了.............");
            }

            @Override
            public void show() {
                System.out.println("show.....................");
            }

        }.eat();

        System.out.println("----------------------------------------------");

        new Animal(){

            @Override
            public void eat() {
                System.out.println("eat方法执行了.............");
            }

            @Override
            public void show() {
                System.out.println("show.....................");
            }

        }.show();

        System.out.println("----------------------------------------------");

        /**
         * 以上代码表示的意思：创建两个对象，分别调用了eat方法和show方法
         * 我们向通过一个匿名内部类的对象去调用eat方法和show方法，怎么实现呢？
         * 思路：把这个匿名内部类赋值给一个变量，我们匿名内部类本质是继承某一个类或者实现了某一个接口的子类对象，那么我们就可以将其赋值给它的父类(接口)类型的变量
         */
        Animal animal = new Animal(){           // 这本质上也是多态

            @Override
            public void eat() {
                System.out.println("eat方法执行了.............");
            }

            @Override
            public void show() {
                System.out.println("show.....................");
            }

        };

        // 调用方法
        animal.show();
        animal.eat();


    }

}
